package service

import (
	"errors"
	"gitee.com/sansaniot/ssiot-core/facade/env"
	"gitee.com/sansaniot/ssiot-core/httpmvc/service"
	"gorm.io/gorm"
	"ssadmin/common/constant"
	cDto "ssadmin/common/query"
	"ssadmin/common/utils"
	"ssadmin/internal/admin/models"
	"ssadmin/internal/admin/models/command"
	"ssadmin/internal/admin/models/query"
)

type UserApp struct {
	service.Service
}

//分页查询当前租户管理的应用列表(避免后续可能拓展)
func (e *UserApp) GetPage(c *query.UserAppQuery, list *[]models.UserApp, count *int64) error {
	//查询应用数据
	return (&models.UserApp{}).GetPage(e.Orm, c, list, count)
}

// Insert 创建User对象
func (e *UserApp) Insert(c *command.UserAppInsertReq) error {
	//新增明细对象
	userAppModel := models.UserApp{}
	c.Generate(&userAppModel)

	//添加
	txErr := e.Orm.Transaction(func(tx *gorm.DB) error {
		//新增对应的应用
		if err := userAppModel.Add(tx, &userAppModel); err != nil {
			return err
		}
		//存在关联的api
		if c.ApiList != nil && len(c.ApiList) > 0 {
			//批量新增应用和api关联中间表
			userAppApi := models.UserAppApi{}
			if err := userAppApi.BatchInsert(tx, userAppModel.AppId, c.ApiList); err != nil {
				return err
			}
		}
		//应用缓存更新
		updateCache(tx, userAppModel.AppId)

		return nil
	})

	return txErr
}

// Update 修改User对象
func (e *UserApp) Update(c *command.UserAppUpdateReq) error {
	if len(c.AppId) == 0 {
		return errors.New("应用id不能为空")
	}

	//修改明细对象
	userAppModel := models.UserApp{}
	c.Generate(&userAppModel)

	//条件参数
	id := query.UserAppDbParam{AppId: c.AppId}
	where := cDto.MakeCondition(id)

	//修改
	txErr := e.Orm.Transaction(func(tx *gorm.DB) error {
		//修改对应的应用
		if err := userAppModel.Mod(e.Orm, &userAppModel, where); err != nil {
			return err
		}
		//判断是否存在对应的api变动
		if c.ApiList != nil {
			//api中间表
			userAppApi := models.UserAppApi{}
			//清空当前值
			userAppApi.DelByAppId(tx, userAppModel.AppId)
			//存在关联的api
			if len(c.ApiList) > 0 {
				//中间表新增
				if err := userAppApi.BatchInsert(tx, userAppModel.AppId, c.ApiList); err != nil {
					return err
				}
			}
		}
		//应用缓存更新
		updateCache(tx, userAppModel.AppId)

		return nil
	})
	return txErr
}

//缓存更新
func updateCache(db *gorm.DB, appId string) {
	//条件
	req := query.UserAppGetReq{}
	req.AppId = appId
	//明细对象
	u := models.UserApp{}
	u.Orm = db

	//明细查询
	if err := u.GetDetail(&req); err == nil {
		//要更新redis的部分
		cacheMap := make(map[string]interface{})

		//api缓存更新
		if u.ApiList != nil && len(u.ApiList) > 0 {
			cacheMap = utils.GetCommUtil().FormatToMap(u.ApiList)
		}
		//缓存应用状态(禁用或有效)
		if len(u.Status) > 0 {
			cacheMap["status"] = u.Status
		}

		//是否存在
		if len(cacheMap) > 0 {
			//删除旧的
			env.Cache.Del(constant.AppKey + appId)
			//插入对应的redis缓存记录
			env.Cache.HashSet(constant.AppKey+appId, cacheMap)
		}
	}
}

// Remove 删除应用信息
func (e *UserApp) Remove(d *query.UserAppDeleteReq) error {
	//获取当前要清理的appid集合
	appIdList := d.GetAppId()
	//处理
	if len(appIdList) == 0 {
		return errors.New("应用id不能为空")
	}
	txErr := e.Orm.Transaction(func(tx *gorm.DB) error {

		//用户应用信息
		data := models.UserApp{}
		data.DelByAppIds(tx, appIdList)

		//应用绑定api信息
		ur := models.UserAppApi{}
		ur.DelByAppIds(tx, appIdList)

		//redis缓存信息
		for _, appId := range appIdList {
			env.Cache.Del(constant.AppKey + appId)
		}

		return nil
	})

	return txErr
}
